package org.smart4j.framework.proxy;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
import java.util.List;

public class ProxyManager {
    //创建代理对象，将 目标类 和 代理链表 穿进去
    public static <T> T createProxy(final Class<?> targetClass, final List<Proxy> proxyList){
        return (T) Enhancer.create(targetClass, new MethodInterceptor() {
            //每当执行目标类中的方法时，都执行对应的 ProxyChain 的 doProxyChain 方法，来执行 代理链 和 真正的方法
            @Override
            public Object intercept(Object targetObject, Method targetMethod, Object[] methodParams, MethodProxy methodProxy) throws Throwable {
                return new ProxyChain(
                        targetClass,
                        targetObject,
                        targetMethod,
                        methodProxy,
                        methodParams,
                        proxyList
                        ).doProxyChain();
            }
        });
    }
}
